package com.gdust.gkyx.common.result;

import lombok.Data;

/**
 * ClassName: Result
 * Package: com.gdust.gkyx.common.result
 * Description:封装API响应的通用结果类
 *
 * 该类用于封装返回给前端的响应结果，包含状态码、消息和数据部分。通过不同的构造方法或静态方法，提供不同的返回方式。
 *
 * @Author syun
 * @Create 2025/1/19 23:53
 * @Version 1.0
 */
@Data // Lombok注解，自动生成get、set方法，toString、equals和hashCode方法
public class Result<T> {

    //状态码
    private Integer code;
    //信息
    private String message;
    //数据，泛型类型 T 可以用于各种数据类型
    private T data;

    //构造私有化
    private Result() { }

    /**
     * //设置数据,返回对象的方法
     * @param data 返回的数据
     * @param code 状态码
     * @param message 响应信息
     * @return
     * @param <T> 数据类型
     */
    public static<T> Result<T> build(T data,Integer code,String message) {
        //创建Resullt对象，设置值，返回对象
        Result<T> result = new Result<>();
        //判断返回结果中是否需要数据
        if(data != null) {
            //设置数据到result对象
            result.setData(data);
        }
        //设置其他值
        result.setCode(code);
        result.setMessage(message);
        //返回设置值之后的对象
        return result;
    }


    /**
     * //设置数据,返回对象的方法
     * @param data 返回的数据
     * @param resultCodeEnum 状态码和信息的枚举类型
     * @return
     * @param <T> 数据类型
     */
    public static<T> Result<T> build(T data,ResultCodeEnum resultCodeEnum) {
        //创建Resullt对象，设置值，返回对象
        Result<T> result = new Result<>();
        //判断返回结果中是否需要数据
        if(data != null) {
            //设置数据到result对象
            result.setData(data);
        }
        //设置其他值
        result.setCode(resultCodeEnum.getCode());
        result.setMessage(resultCodeEnum.getMessage());
        //返回设置值之后的对象
        return result;
    }

    /**
     * //成功的方法
     * @param data 返回的数据
     * @return
     * @param <T> 数据类型
     */
    public static<T> Result<T> ok(T data) {
        Result<T> result = build(data, ResultCodeEnum.SUCCESS);
        return result;
    }

    /**
     * //失败的方法
     * @param data 返回的数据
     * @return
     * @param <T>
     */
    public static<T> Result<T> fail(T data) {
        return build(data,ResultCodeEnum.FAIL);
    }

}

